package com.shengzai

object Code33implicit {
  def main(args: Array[String]): Unit = {
    /*
    隐式转换的类型:
      1.隐式转换函数
      2.隐式转换变量
      3.隐式转换类
     */

//    1.隐式转换函数

    println(changeStr(new StrClazz("10")))

    val strClazz = new StrClazz("9")
    println(strClazz + 10)

    val changeStrRes: Int = changeStr(strClazz) // 19
    println(changeStrRes + 10) // 29

  }

  /**
   *
   *  当函数前加上 implicit 关键字后，可以被Scala底层自动调用，不需要用户在代码中添加对应的函数调用，
   *      Scala底层自动调用： 当类或者变量存在时，如果发现有其他的隐式转换函数传入的参数和该变量的类型一致，
   *          那么会自动在编译的时候进行显示调用
   *  注意：隐式转换函数中的参数为单个的
   * @param strClazz
   * @return
   */

  // 通过添加implicit可以将当前的函数设置为隐式转换函数
  implicit def changeStr(strClazz: StrClazz): Int = {
    strClazz.str.toInt + 10
  }


}

case class StrClazz(str:String)
